import { AstTreeUtils } from "arkanalyzer";
import { ts, NodePredicate } from "qvog-dsl";
import { NewExpression, CallExpression, is, native, ObjectLiteralExpression, rule, HomeCheckHint } from "qvog-dsl";

const SEVERITY = 2;
const DOC_PATH = '';
const DESCRIPTION = 'When the third parameter KeyGenerator of ForEach uses the default key generation rule (index + \'__\' + JSON.stringify(item)), inserting a new array item triggers component recreation for all subsequent items, leading to poor performance with large datasets or complex components due to lack of component reuse.';

function call2Ident(callExpression: ts.CallExpression | undefined): ts.Identifier | undefined {
    if (callExpression !== undefined) {
        let sig = callExpression.expression;
        if (sig.kind === ts.SyntaxKind.Identifier) {
            return sig as ts.Identifier;
        }
    }
    return undefined;
}

export default native<HomeCheckHint>()()
    .match(CallExpression)
    .when((node: ts.CallExpression): boolean => {
        let callExpression = node;
        let iden = call2Ident(callExpression);
        let flag = false;
        if (iden) {
            if (iden.escapedText === 'ForEach') {
                let args = callExpression.arguments;
                if (args.length < 3) {
                    flag = true;
                }
            }
        }
        return flag;
    })
    .report({
        severity: SEVERITY,
        description: DESCRIPTION,
        docPath: DOC_PATH,
    });

